/***********************************************************************************
 * 文件名： HAL_USP_Config.h
 * 作者： 刘言
 * 版本： 1
 * 说明：
 * 		HAL_USP 驱动配置文件。
***********************************************************************************/
#ifndef _HAL_USP_CONFIG_H_
#define _HAL_USP_CONFIG_H_

#include "mcu_def.h"

// 型号系列
#define HAL_USP_MCU_SERIES     PY32F403

/////////////////////////////////////////////////////////////////////////////////////
// 外设的初始参数配置，调用相应的初始化函数后将按照以下参数进行初始化，如需运行过程中修改参数
// 调用对应驱动的API即可。对于不使用的外设（不调用Init函数）可以不必理会其配置参数。
/////////////////////////////////////////////////////////////////////////////////////

//////////////////////// 时钟配置（SystemInit）

#define HSE_VALUE   (8000000) /*!< Value of the External oscillator in Hz */

/**
 * 0 - HSI
 * 1 - HSE
 * 2 - HSI-PLL
 * 3 - HSE-PLL
*/
#define SYSCLK_SRC  2

#if (SYSCLK_SRC == 0 && HAL_USP_MCU_SERIES == PY32F002B)
#define HSI_DIV     LL_RCC_HSI_DIV_1    // HSI分频比 PY32F002B 的HSI为24M
#endif

#if (SYSCLK_SRC == 2 || SYSCLK_SRC == 3)
    #define PLL_MUL     18
#endif
/**
 *  AHB1外设时钟使能初始使能，需要用到的外设可以在这里统一使能时钟门控，多个外设用 | 隔开
 *          RCC_AHB1ENR_DMA1EN, RCC_AHB1ENR_DMA2EN, RCC_AHB1ENR_SRAMEN
 *          RCC_AHB1ENR_FMCEN, RCC_AHB1ENR_CRCEN, RCC_AHB1ENR_SDIOEN
 *          RCC_AHB1ENR_ESMCEN
 * @note SRAM 和 FMC 时钟配置为0后将在休眠后关闭。
*/
#define RCC_AHB1_PERIPH_CLKEN    RCC_AHB1ENR_FMCEN|RCC_AHB1ENR_SRAMEN

/**
 *  AHB2外设时钟使能初始使能，需要用到的外设可以在这里统一使能时钟门控，多个外设用 | 隔开
 *          RCC_AHB2ENR_IOPAEN, RCC_AHB2ENR_IOPBEN, RCC_AHB2ENR_IOPCEN
 *          RCC_AHB2ENR_IOPDEN, RCC_AHB2ENR_IOPEEN
*/
#define RCC_AHB2_PERIPH_CLKEN    RCC_AHB2ENR_IOPAEN

/**
 *  APB1外设时钟使能初始使能，需要用到的外设可以在这里统一使能时钟门控，多个外设用 | 隔开
 *          RCC_APB1ENR_TIM2EN, RCC_APB1ENR_TIM3EN, RCC_APB1ENR_TIM4EN,
 *          RCC_APB1ENR_TIM5EN, RCC_APB1ENR_TIM6EN, RCC_APB1ENR_TIM7EN,
 *          RCC_APB1ENR_TIM12EN, RCC_APB1ENR_TIM13EN, RCC_APB1ENR_TIM14EN,
 *          RCC_APB1ENR_WWDGEN, RCC_APB1ENR_SPI2EN, RCC_APB1ENR_SPI3EN,
 *          RCC_APB1ENR_USART2EN, RCC_APB1ENR_USART3EN, RCC_APB1ENR_USART4EN,
 *          RCC_APB1ENR_USART5EN, RCC_APB1ENR_I2C1EN, RCC_APB1ENR_I2C2EN,
 *          RCC_APB1ENR_USBEN, RCC_APB1ENR_CANEN, RCC_APB1ENR_BKPEN,
 *          RCC_APB1ENR_PWREN, RCC_APB1ENR_CTCEN
*/
#define RCC_APB1_PERIPH_CLKEN   0

/**
 *  APB2外设时钟使能初始使能，需要用到的外设可以在这里统一使能时钟门控，多个外设用 | 隔开
 *          RCC_APB2ENR_SYSCFGEN, RCC_APB2ENR_ADC1EN, RCC_APB2ENR_ADC2EN,
 *          RCC_APB2ENR_TIM1EN, RCC_APB2ENR_SPI1EN, RCC_APB2ENR_TIM8EN,
 *          RCC_APB2ENR_USART1EN, RCC_APB2ENR_ADC3EN, RCC_APB2ENR_TIM9EN,
 *          RCC_APB2ENR_TIM10EN, RCC_APB2ENR_TIM11EN
*/
#define RCC_APB2_PERIPH_CLKEN   RCC_APB2ENR_SYSCFGEN|RCC_APB2ENR_USART1EN

//////////////////////// APP 起始地址
// 本软件在FLASH中保存的起始地址(相对地址、偏移)
// 如果OTA升级(存在BootLoader)，用户程序起始地址可能不为0，必须修改实际的起始地址，
// 这会影响中断向量表地址寄存器（VTOR），和Flash的读写操作。
// 与实际不符会导致中断无法响应、跑飞！！！
#define APP_BASE    0

//////////////////////// SysTick 的配置

#define SYSTICK_PERIOD          10000           // 周期，us

////////////////////// 

// Mcu_Init() 有效配置，Mcu_Init()将被Polsys_Init()调用，注释掉 Mcu_Init() 将无效，需要自己调用Mcu_InitClock()来代替。
// #define _MCU_INIT_VALID

/////////////////////// GPIO初始配置

// 初始输出寄存器值

#define _GPIO_PA_ODR    0x0000
#define _GPIO_PB_ODR    0x0000
#define _GPIO_PC_ODR    0x0000
#define _GPIO_PD_ODR    0x0000
#define _GPIO_PE_ODR    0x0000

// 初始模式列表
#define _GPIO_INIT_LIST \
{   \
    {GPIOA, GPIO_PIN_9, GPIO_NOPULL, GPIO_SPEED_FREQ_HIGH, GPIO_MODE_AF_PP, GPIO_AF2_USART1},   \
    {GPIOA, GPIO_PIN_10, GPIO_PULLUP, GPIO_SPEED_FREQ_HIGH, GPIO_MODE_AF_PP, GPIO_AF2_USART1}\
}

/////////////////////// Uart 初始配置
// 不开启对应的UART可以节省内存资源。
// BUFF_SIZE 为 0 时表示不启用对应的缓存功能。
// 如果你在串口中断中直接获取收到的字节并及时处理了建议不开启接收缓存。
// 接收中断中通知线程去处理的方式因为不能确保线程及时得到运行，建议开启接收缓存。
// 建议始终开启发送缓存，否则发送将死等。设置合适的缓存尺寸，如果未开启缓存尺寸自动调整，缓存满了也会死等或者阻塞。

#define _UART_USE_USART1
// #define _UART_USE_USART2
// #define _UART_USE_USART3
// #define _UART_USE_USART4
// #define _UART_USE_USART5
// #define _UART_USE_USART6
// #define _UART_USE_USART7
// #define _UART_USE_USART8

#ifdef _UART_USE_USART1
    #define _UART_USART1_NAME           ConsoleUart
    #define _UART_USART1_TX_BUFF_SIZE   0     /* 最大65535 */
    #define _UART_USART1_RX_BUFF_SIZE   0      /* 最大65535 */
#endif
#ifdef _UART_USE_USART2
    #define _UART_USART2_NAME           Uart2
    #define _UART_USART2_TX_BUFF_SIZE   128
    #define _UART_USART2_RX_BUFF_SIZE   0
#endif
#ifdef _UART_USE_USART3
    #define _UART_USART3_NAME           Uart3
    #define _UART_USART3_TX_BUFF_SIZE   128
    #define _UART_USART3_RX_BUFF_SIZE   0
#endif
#ifdef _UART_USE_USART4
    #define _UART_USART4_NAME            Uart4
    #define _UART_USART4_TX_BUFF_SIZE    128
    #define _UART_USART4_RX_BUFF_SIZE    0
#endif
#ifdef _UART_USE_USART5
    #define _UART_USART5_NAME            TurmUart
    #define _UART_USART5_TX_BUFF_SIZE    8
    #define _UART_USART5_RX_BUFF_SIZE    0
#endif
#ifdef _UART_USE_USART6
    #define _UART_USART6_NAME            Uart6
    #define _UART_USART6_TX_BUFF_SIZE    128
    #define _UART_USART6_RX_BUFF_SIZE    0
#endif
#ifdef _UART_USE_USART7
    #define _UART_UART7_NAME            RemoteUart
    #define _UART_UART7_TX_BUFF_SIZE    136
    #define _UART_UART7_RX_BUFF_SIZE    0
#endif
#ifdef _UART_USE_USART8
    #define _UART_UART8_NAME            Uart8
    #define _UART_UART8_TX_BUFF_SIZE    0
    #define _UART_UART8_RX_BUFF_SIZE    0
#endif

/**
 * 缓存方式
 * 0 - 静态定义缓存，始终占用固定内存。【CPU占用最低，依耐最小，缓存不大时推荐】
 * 1 - 动态申请，串口关闭后释放，尺寸固定。
 * 2 - 动态申请，串口关闭后释放，尺寸自动调整，静态定义的为最小尺寸。
 * 3 - 动态申请，发送完毕，或者读完数据后自动释放，尺寸自动调整，静态定义的为最小尺寸。【缓存需要很大，内存资源又紧张时使用，CPU占用最高】
*/
#define _UART_BUFF_MODE     0

/**
 * 阻塞方式。在写入（发送）时缓存满了，在读取时缓存为空，这两种情况下的处理策略。
 * 1 - 写入死等阻塞，读取不阻塞返回实际读取的字节数（单字节读取返回-1表示没有数据）。【推荐】
 * 2 - 写入信号量阻塞，读取不阻塞返回实际读取的字节数（单字节读取返回-1表示没有数据）。
 * 4 - 写入信号量阻塞，读取信号量阻塞
*/
#define _UART_BLOCKING_MODE     1

////////////////////////// 内存管理API定义

#if _UART_BUFF_MODE != 0
    #define _MCU_USE_STD_MEM_ALLOC
    #ifndef _MCU_USE_STD_MEM_ALLOC
        #define _MCU_MEM_INCLUDE    <stdlib.h>
        #define _Mcu_Alloc(size)    malloc(size)
        #define _Mcu_Free()         free()
        #define _Mcu_ReAlloc(size)  realloc(size)
    #endif
#endif



#endif
